/**
 * 修复模型文件名编码问题
 * 将已经保存的乱码文件名转换为正确的UTF-8编码
 */

const fs = require('fs').promises;
const path = require('path');
const { PROJECTS_DIR } = require('./constants');
const { readProjectsIndex } = require('../services/projectService');

/**
 * 修复单个字符串的编码
 * @param {string} str - 可能乱码的字符串
 * @returns {string} - 修复后的字符串
 */
function fixStringEncoding(str) {
    if (!str) return str;
    
    try {
        // 检测乱码特征：
        // 1. 包含连续的latin1扩展字符 (0xC0-0xFF)
        // 2. 包含特定的乱码模式
        const hasGarbledChars = /[\u00C0-\u00FF]{2,}/.test(str);
        const garbledPatterns = [
            /[ÃÅÆ][¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿]/,  // 常见中文乱码
            /å®æ³¥/,  // "实泥" 的乱码
            /ææ/,    // "我" 的乱码  
            /Ã[^A-Za-z\s]/,  // Ã 后跟非字母
        ];
        
        const hasGarbledPattern = garbledPatterns.some(pattern => pattern.test(str));
        
        if (hasGarbledChars || hasGarbledPattern) {
            // 尝试从latin1转换为UTF-8
            const fixed = Buffer.from(str, 'latin1').toString('utf8');
            
            // 验证修复后的字符串是否合理（包含中文字符）
            const hasChinese = /[\u4e00-\u9fa5]/.test(fixed);
            
            if (hasChinese || fixed !== str) {
                console.log(`  ✅ 编码修复: "${str}" -> "${fixed}"`);
                return fixed;
            }
        }
        
        return str;
    } catch (error) {
        console.warn(`  ⚠️  编码修复失败，保持原样: ${str}`, error.message);
        return str;
    }
}

/**
 * 修复项目中所有模型的文件名编码
 * @param {string} projectId - 项目ID
 */
async function fixProjectModelsEncoding(projectId) {
    try {
        console.log(`\n🔧 开始修复项目 ${projectId} 的模型编码...`);
        
        const index = await readProjectsIndex();
        const projectMeta = index.projects.find(p => p.id === projectId);
        
        if (!projectMeta) {
            console.error(`❌ 项目不存在: ${projectId}`);
            return false;
        }
        
        const modelsConfigPath = path.join(PROJECTS_DIR, projectMeta.path, 'models', 'models.json');
        
        // 读取模型配置
        const modelsData = await fs.readFile(modelsConfigPath, 'utf-8');
        const modelsConfig = JSON.parse(modelsData);
        
        let fixedCount = 0;
        
        // 修复每个模型的文件名
        modelsConfig.models.forEach(model => {
            const originalName = model.name;
            const originalFilename = model.filename;
            const originalOriginalName = model.originalName;
            
            // 修复各个字段
            model.name = fixStringEncoding(model.name);
            model.filename = fixStringEncoding(model.filename);
            if (model.originalName) {
                model.originalName = fixStringEncoding(model.originalName);
            }
            if (model.description) {
                model.description = fixStringEncoding(model.description);
            }
            
            // 检查是否有修复
            if (originalName !== model.name || 
                originalFilename !== model.filename || 
                originalOriginalName !== model.originalName) {
                fixedCount++;
                console.log(`✅ 修复模型: ${model.id}`);
            }
        });
        
        if (fixedCount > 0) {
            // 保存修复后的配置
            await fs.writeFile(
                modelsConfigPath, 
                JSON.stringify(modelsConfig, null, 2), 
                'utf-8'
            );
            console.log(`✅ 成功修复 ${fixedCount} 个模型的编码`);
        } else {
            console.log(`ℹ️  未发现需要修复的编码问题`);
        }
        
        return true;
        
    } catch (error) {
        console.error(`❌ 修复失败:`, error);
        return false;
    }
}

/**
 * 修复所有项目的模型编码
 */
async function fixAllProjectsEncoding() {
    try {
        console.log('🔧 开始修复所有项目的模型编码...\n');
        
        const index = await readProjectsIndex();
        
        for (const project of index.projects) {
            await fixProjectModelsEncoding(project.id);
        }
        
        console.log('\n✅ 所有项目编码修复完成！');
        
    } catch (error) {
        console.error('❌ 修复失败:', error);
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    fixAllProjectsEncoding()
        .then(() => {
            console.log('\n✨ 编码修复工具执行完成');
            process.exit(0);
        })
        .catch(error => {
            console.error('❌ 执行失败:', error);
            process.exit(1);
        });
}

module.exports = {
    fixStringEncoding,
    fixProjectModelsEncoding,
    fixAllProjectsEncoding
};

